插件下载方案一:下载 & 解压功能开发
概述
本节实现插件下载的第一种方案:从远端下载 ZIP 压缩包并在本地解压安装。流程包括:创建插件 ZIP 包、推送到 GitHub 仓库、获取 Raw URL、实现下载与解压逻辑。
下载流程
用户点击插件列表项
│
▼
渲染进程发送 IPC → 主进程接收 download-ext
│
▼
主进程下载 ZIP 文件
│
▼
解压到 .electron-tools/extensions/ 目录
│
▼
动态加载插件模块
text
创建测试插件
插件文件结构
// extensions-1/index.js
export function run() {
console.log('extensions-1 loaded')
}
typescript
压缩与上传
# 压缩为 ZIP
zip -r extensions-1.zip extensions-1/
# 推送到 GitHub 仓库
git add extensions-1.zip
git commit -m "add extension zip"
git push origin main
bash
获取下载 URL
在 GitHub 仓库中点击 ZIP 文件 -> Raw 按钮,复制 URL:
https://raw.githubusercontent.com/user/toimc-extensions/main/extensions-1.zip
text
下载与解压实现
安装依赖
npm install node-fetch fs-extra adm-zip
bash
核心代码
import fetch from 'node-fetch'
import fs from 'fs-extra'
import path from 'path'
import os from 'os'
import AdmZip from 'adm-zip'
const HOME_DIR = os.homedir()
const EXTENSIONS_DIR = path.join(HOME_DIR, '.electron-tools/extensions')
// 下载远端 ZIP 文件
async function downloadRemoteZip(url: string): Promise<Buffer> {
const response = await fetch(url)
if (!response.ok) {
throw new Error(`下载失败: ${response.statusText}`)
}
return Buffer.from(await response.arrayBuffer())
}
// 解压 ZIP 到目标目录
async function unzip(
zipBuffer: Buffer,
targetPath: string,
zipFileName: string
): Promise<void> {
const zip = new AdmZip(zipBuffer)
const extractPath = path.join(targetPath, zipFileName.replace('.zip', ''))
await fs.ensureDir(extractPath)
zip.extractAllTo(extractPath, true)
}
// 主流程
async function downloadExtension(item: ExtensionItem): Promise<void> {
const zipBuffer = await downloadRemoteZip(item.url)
await fs.ensureDir(EXTENSIONS_DIR)
const fileName = path.basename(item.url)
await unzip(zipBuffer, EXTENSIONS_DIR, fileName)
console.log(`插件 ${item.name} 下载完成`)
}
typescript
解压路径修正
解压路径应为目标目录 + ZIP 文件名(去掉 .zip 后缀):
// 错误写法
const extractPath = targetPath // 解压到了错误的路径
// 正确写法
const fileName = path.basename(url) // extensions-1.zip
const extractPath = path.join(targetPath, fileName.replace('.zip', ''))
// 结果: ~/.electron-tools/extensions/extensions-1/
typescript
插件列表 JSON 更新
[
{
"name": "extensions-1",
"description": "测试插件",
"url": "https://raw.githubusercontent.com/user/toimc-extensions/main/extensions-1.zip"
}
]
json
关键要点
- ZIP 文件通过 GitHub Raw URL 直接下载,无需额外服务器
- 使用
adm-zip进行解压,node-fetch进行 HTTP 请求 - 解压路径必须包含插件目录名(从 ZIP 文件名提取)
- 目标目录使用隐藏文件夹
.electron-tools/extensions/统一管理 - 下载完成后可通过
require()或import()动态加载插件
↑